using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    private CharacterController character;  // 人物移动容器（原注释），用于控制角色的移动行为
    private Animator animator; // 人物动画容器（原注释），用于控制角色的动画播放

    void Start()
    {
        // 获取角色控制组件，用于处理角色的移动
        character = GetComponent<CharacterController>();
        // 获取动画组件，用于控制角色动画，假设动画组件在角色对象的第二层子对象中
        animator = transform.GetChild(0).GetChild(0).GetComponent<Animator>();
    }

    void Update()
    {
        // 更新每一帧的操作，包括移动、旋转和动画播放
        move();
        rotate();
        animPlay();
    }

    public float walkSpeed; // 角色的移动速度
    public float runSpeed;  // 角色的奔跑速度
    public float JumpHeight; // 跳跃高度

    public Vector3 moveInXZ = Vector3.zero; // 在XZ平面上的移动向量
    public Vector3 moveInY = Vector3.zero; // 在Y轴上的移动向量（用于跳跃）

    // 控制人物移动
    private void move()
    {
        // 计算移动方向和位移（原注释），结合前进方向和横向方向，根据用户输入计算移动向量
        moveInXZ = transform.forward * InputControl.input.Vertical + transform.right * InputControl.input.Horizontal;

        // 归一化处理，防止斜方向移动时速度过快
        moveInXZ = moveInXZ.normalized;

        // 根据用户输入设置跳跃高度（原注释），将跳跃力添加到Y轴方向的移动向量
        moveInY.y += JumpHeight * InputControl.input.Jump;

        // 如果没有剧情在进行，则允许角色移动
        if (CharacterParam.param.isPlot != true)
        {
            // 判断是否按下了左Shift键，如果按下则设置为奔跑速度，否则为走路速度
            if (Input.GetKey(KeyCode.LeftShift))
            {
                moveInXZ *= runSpeed; // 设置为奔跑速度
            }
            else
            {
                moveInXZ *= walkSpeed; // 设置为行走速度
            }
            // 根据XZ方向的位移更新角色的位置
            character.Move(moveInXZ * Time.deltaTime);
        }
        else
        {
            // 如果在剧情中，则禁止角色移动
            moveInXZ = Vector3.zero;
        }

        // 处理Y方向的位移（跳跃），更新角色的位置
        character.Move(moveInY * Time.deltaTime);
    }

    private float angleY = 0; // 累计的Y轴旋转角度
    public float maxAngle; // 最大仰角（向上看的最大角度）
    public float minAngle; // 最小俯角（向下看的最小角度）

    // 控制摄像机旋转
    private void rotate()
    {
        // 根据鼠标输入调整绕X轴的旋转角度，向上为负，向下为正
        angleY -= InputControl.input.MouseY; // 累计绕x轴旋转的角度（原注释）

        // 限制绕X轴旋转的角度范围，防止超过设定的最大和最小角度
        angleY = Mathf.Clamp(angleY, -maxAngle, -minAngle);

        // 更新摄像机的局部旋转，设置为绕X轴的旋转
        Camera.main.transform.localRotation = Quaternion.Euler(angleY, 0, 0);

        // 控制角色绕Y轴旋转（原注释写错了，不是Z轴，而是Y轴），根据鼠标水平输入旋转
        transform.Rotate(Vector3.up, InputControl.input.MouseX);
    }

    // 控制人物动画播放
    private void animPlay()
    {
        // 根据角色移动的速度，设置动画中"stopOrMove"参数的值
        animator.SetFloat("stopOrMove", moveInXZ.magnitude);

        // 确保动画对象的位置和旋转重置为初始状态
        transform.GetChild(0).GetChild(0).transform.localPosition = Vector3.zero;
        transform.GetChild(0).GetChild(0).transform.localRotation = Quaternion.Euler(Vector3.zero);
    }
}
